/**
 * Copyright (C), 2021-2023, 四信物联网有限公司
 * FileName: ObjectOperate
 * Author:   Chapin
 * Date:     2023/10/19 14:28
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.fourfaith.iot.beidou.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 〈〉
 * @author Chapin
 * @create 2023/10/19
 * @since 1.0.0
 */
public class ObjectOperate<T> {

    /**
     * 设置数据类对象的属性
     * @param obj   数据类对象的实例
     * @param fieldName  属性名
     * @param fieldType  属性类型名
     * @param val   需要存入的属性值
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public void setValues(T obj, String fieldName, String fieldType, Object val) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        // 设置为属性的set方法名，如：属性名为id，对应set方法名为setId
        fieldName = "set"+fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
        Method method = null;
        // 通过属性类型来获取相应的方法以及强制转化属性值并初始化相应属性
        // 这里考虑到了大部分常用的数据类型，可拿来即用。
        switch (fieldType){
            case "int":
                method = obj.getClass().getMethod(fieldName, int.class);
                method.invoke(obj,(int)val);
                break;
            case "short":
                method = obj.getClass().getMethod(fieldName, short.class);
                method.invoke(obj,(short)val);
                break;
            case "long":
                method = obj.getClass().getMethod(fieldName, long.class);
                method.invoke(obj,(long)val);
                break;
            case "float":
                method = obj.getClass().getMethod(fieldName, float.class);
                method.invoke(obj,(float)val);
                break;
            case "double":
                method = obj.getClass().getMethod(fieldName, double.class);
                method.invoke(obj,(double)val);
                break;
            case "boolean":
                method = obj.getClass().getMethod(fieldName, boolean.class);
                method.invoke(obj,(boolean)val);
                break;
            case "java.lang.String":
                method = obj.getClass().getMethod(fieldName, String.class);
                method.invoke(obj,(String)val);
                break;
            case "java.util.Date":
                method = obj.getClass().getMethod(fieldName, Date.class);
                method.invoke(obj,(Date)val);
                break;
            case "java.math.BigDecimal":
                method = obj.getClass().getMethod(fieldName, BigDecimal.class);
                method.invoke(obj,(BigDecimal)val);
                break;
        }
    }

    /**
     * 根据属性名获取对象的属性值
     * @param obj
     * @param fieldName
     * @return
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public Object getValue(T obj,String fieldName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        // 设置为属性的get方法名，如：属性名为id，对应get方法名为getId
        fieldName = "get"+fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
        Method method = obj.getClass().getMethod(fieldName);
        return method.invoke(obj);
    }


}
